Redis 原理与实践浅析
Redis是一种将数据保存在内存中的nosql数据库,可定时把内存数据同步到磁盘,即可以将数据持久化,并且他比memcached支持更多的数据结构(string,list列表[队列和栈],set[集合],sorted set[有序集合],hash(hash表))
Redis 特点
完全开源免费的高性能的key_value数据库。
支持数据的持久化,可以将内存中的数据保持在磁盘中,重启的时候可以再次加载进行使用。
不仅仅支持简单的key_value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。
支持数据的备份,即master_slave模式的数据备份。
Redis 优势
性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。
丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。
原子 – Redis的所有操作都是原子性的,同时Redis还支持对几个操作全并后的原子性执行。
丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。
Redis与其他key-value存储有什么不同?
Redis有着更为复杂的数据结构并且提供对他们的原子性操作,这是一个不同于其他数据库的进化路径。Redis的数据类型都是基于基本数据结构的同时对程序员透明,无需进行额外的抽象。
Redis运行在内存中但是可以持久化到磁盘,所以在对不同数据集进行高速读写时需要权衡内存,因为数据量不能大于硬件内存。在内存数据库方面的另一个优点是, 相比在磁盘上相同的复杂的数据结构,在内存中操作起来非常简单,这样Redis可以做很多内部复杂性很强的事情。 同时,在磁盘格式方面他们是紧凑的以追加的方式产生的,因为他们并不需要进行随机访问。
Redis安装
1、下载
wget http://download.redis.io/releases/redis-3.2.9.tar.gz
目前Redis稳定版本为3.2.9,最新Bate为4.0
2、解压
tar -zxvf redis-3.2.9.tar.gz
3、安装
cd redis-3.2.9.tar.gz
make
make完成后,redis目录下会出现编译后的redis服务程序,redis-server,还有用于测试的客户端程序redis-cli。注意:有的安装完成后,redis-server会在src目录下。
启动redis-server后如下:
直接启动默认是前进程,关闭后程序自动停止,另开一个窗口,进行测试链接,利用redis-cli连接,可以进行交互操作。
如要后台启动redis,需要修改Redis配置文件的daemonize为yes。
redis配置有两种方式可进行修改或查看,一种是查看redis.conf配置文件,另一种是通过redis.cli客户端,进行连接,利用config命令进行查看(get)和配置(set)。
Redis数据持久化
Redis数据虽然在内存中,同时也支持持久化,有两种方式:
1、将数据保存到数据文件.rdb中,安全性高,但对效率有影响,如果不是对数据完整性要求极高,不推荐使用这种方式。
2、保存对数据有影响的操作命令到.aof中,保存操作命令的频率可配置,比较灵活,效率高,推荐使用
Redis语法
对string字符串的操作(curd)
set:增加,修改 set key value
get:查询
del:删除
expire:设置有效时间 expire key 时间
ttl key:查看某个key-value时间
keys:查看当前redis中所有的key有哪些
对list的curd
在list前面加:LPUSH key value
取list值:LRANGE key start stop
在list后面加:RPUSH key value
从左移除list值:LPOP key
从右移除list值:RPOP key
LREM:LREM key count value 根据count参数的值,移除与value相等的元素
count>0:从表头开始向表尾搜索,移除与value相等的元素,数量为count
count<0:从表尾开始向表头搜索,移除与value相等的元素,数量为count的绝对值
count=0:移除表中所有与value相等的值
指定返回第几个元素:LINDEX key index
对hash数据结构的操作
添加:hset key field value
取某个值:hget key fieled
取所有键值:hkeys key
删除:hdel key
取所有值:hvals key
redis发布订阅
创建订阅频道:SUBSCRIBE redisChat(频道名)
推送订阅消息:PUBLISH redisChat “text”
redis事务
redis事务特点:1、事务是一个单独的隔离文件,事务中所有的命令都会序列化,按顺序地执行。事务在执行的过程中,不会被其他客户端发送来的命令请求打断。
2、事务是一个原子操作:事务中的命令要么全部被执行,要么全部都不执行。
事务命令:1、discard 取消事务,放弃执行事务块内的所有命令
2、exec 执行所有事务块内的命令
3、multi 标记一个事务块的开始
4、unwatch 取消watch命令对所有key的监视
5、watch key [key ...]监视一个或多个key,如果在事务执行前这个key被其他命令所改动,那么事务将被打断。
redis脚本
redis脚本通过lua解释器来执行脚本,执行脚本的常用命令为eval
语法:eval script numkeys key [key...] arg [arg...]
redis服务器
redis服务命令:
1 BGREWRITEAOF 异步执行一个 AOF(AppendOnly File) 文件重写操作
2 BGSAVE 在后台异步保存当前数据库的数据到磁盘
3 CLIENT KILL [ip:port] [ID client-id] 关闭客户端连接
4 CLIENT LIST 获取连接到服务器的客户端连接列表
5 CLIENT GETNAME 获取连接的名称
6 CLIENT PAUSE timeout 在指定时间内终止运行来自客户端的命令
7 CLIENT SETNAME connection-name 设置当前连接的名称
8 CLUSTER SLOTS 获取集群节点的映射数组
9 COMMAND 获取 Redis 命令详情数组
10 COMMAND COUNT 获取 Redis 命令总数
11 COMMAND GETKEYS 获取给定命令的所有键
12 TIME 返回当前服务器时间
13 COMMAND INFO command-name [command-name ...] 获取指定 Redis 命令描述的数组
14 CONFIG GET parameter 获取指定配置参数的值
15 CONFIG REWRITE 对启动 Redis 服务器时所指定的 redis.conf 配置文件进行改写
16 CONFIG SET parameter value 修改 redis 配置参数,无需重启
17 CONFIG RESETSTAT 重置 INFO 命令中的某些统计数据
18 DBSIZE 返回当前数据库的 key 的数量
19 DEBUG OBJECT key 获取 key 的调试信息
20 DEBUG SEGFAULT 让 Redis 服务崩溃
21 FLUSHALL 删除所有数据库的所有key
22 FLUSHDB 删除当前数据库的所有key
23 INFO [section] 获取 Redis 服务器的各种信息和统计数值
24 LASTSAVE 返回最近一次 Redis 成功将数据保存到磁盘上的时间,以 UNIX 时间戳格式表示
25 MONITOR 实时打印出 Redis 服务器接收到的命令,调试用
26 ROLE 返回主从实例所属的角色
27 SAVE 异步保存数据到硬盘
28 SHUTDOWN [NOSAVE] [SAVE] 异步保存数据到硬盘,并关闭服务器
29 SLAVEOF host port 将当前服务器转变为指定服务器的从属服务器(slave server)
30 SLOWLOG subcommand [argument] 管理 redis 的慢日志
31 SYNC 用于复制功能(replication)的内部命令
redis数据备份与恢复
redis数据备份:SAVE
在redis中执行save命令后,会在安装目录中创建dump.rdb文件。
redis数据恢复:将dump.rdb文件移动到redis安装目录,并重新启动redis服务即可
获取redis目录:config get dir
bgsave:改命令也可以保存,但该命令在后台执行。
redis安全
通过redis配置文件设置密码参数,这样客户端连接的时候就需要密码验证了
config set requirepass:设置密码验证
config get requirepass:查看是否有密码认证
设置密码验证后,需要进行密码验证,否则无法执行任何命令
auth password:验证密码
redis性能测试
redis性能测试时通过同时执行多个命令实现
redis-benchmark [option] [option value]
参数:
1 -h 指定服务器主机名 127.0.0.1
2 -p 指定服务器端口 6379
3 -s 指定服务器 socket
4 -c 指定并发连接数 50
5 -n 指定请求数 10000
6 -d 以字节的形式指定 SET/GET 值的数据大小 2
7 -k 1=keep alive 0=reconnect 1
8 -r SET/GET/INCR 使用随机 key, SADD 使用随机值
9 -P 通过管道传输 <numreq> 请求 1
10 -q 强制退出 redis,仅显示 query/sec 值
11 --csv 以 CSV 格式输出
12 -l 生成循环,永久执行测试
13 -t 仅运行以逗号分隔的测试命令列表
14 -I Idle 模式,仅打开 N 个 idle 连接并等待
以上部分理论知识翻译于Redis官网,若有错误,请指正。